package top.xlq.mydb.backend.dm.page;

import top.xlq.mydb.backend.dm.pageCache.PageCache;
import top.xlq.mydb.backend.utils.RandomUtil;

import java.util.Arrays;

/**
 * 特殊管理第一页
 * ValidCheck
 * db启动时给100~107字节处填入一个随机字节，db关闭时将其拷贝到108~115字节
 * 用于判断上一次数据库是否正常关闭
 */
public class PageOne {
    private static final Integer OF_VC = 100;
    private static final Integer LEN_VC = 8;
    // 初始化一个第一页数据
    public static byte[] initRaw(){
        byte[] raw = new byte[PageCache.PAGE_SIZE];
        setVcOpen(raw);
        return raw;
    }

    // 设置页面的"ValidCheck"为打开状态
    public static void setVcOpen(Page page) {
        page.setDirty(true);
        setVcOpen(page.getData());
    }

    private static void setVcOpen(byte[] raw) {
        // 随机生成8字节的数据，并拷贝到第一页的 100~107 字节
        System.arraycopy(RandomUtil.randomBytes(LEN_VC), 0, raw, OF_VC, LEN_VC);
    }

    // 设置页面的"ValidCheck"为关闭状态
    public static void setVcClose(Page page) {
        page.setDirty(true);
        setVcClose(page.getData());
    }

    private static void setVcClose(byte[] raw) {
        // 通过复制raw数组中的一部分元素来实现,拷贝到第一页的 108 ~ 115 字节。
        System.arraycopy(raw, OF_VC, raw, OF_VC + LEN_VC, LEN_VC);
    }

    // 校验数据库是否正常关闭
    public static boolean checkVc(Page page) {
        return checkVc(page.getData());
    }

    private static boolean checkVc(byte[] raw) {
        //检查数据的100-107字节和108-115字节是否一样
        return Arrays.equals(Arrays.copyOfRange(raw, OF_VC, OF_VC + LEN_VC),Arrays.copyOfRange(raw,OF_VC+LEN_VC,OF_VC+2*LEN_VC));
    }
}
